﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Mvc;
using myFinance.BLL;
using myFinance.Models;
using System.Diagnostics;
using System.Text;
using myFinance.Models.ViewModels;

namespace myFinance.Controllers
{
    [Authorize]
    public class TarefaController : Controller
    {
        #region ViewModels
        TarefaViewModel viewModel = new TarefaViewModel();
        #endregion

        #region Index
        public ActionResult Index() // Index padrão
        {
            // Se o usuário ainda não tiver um cadastro gravado, retorna pro cadastro
            if (PessoaBll.GetPessoa(User.Identity.Name) == null)
                return RedirectToAction("Cadastro", "Perfil");
            
            var mes = DateTime.Now.Month;
            var ano = DateTime.Now.Year;

            ViewBag.Mes = new SelectList(AuxiliaresBll.PreencheComboMes(), "Value", "Key", mes);
            ViewBag.Ano = new SelectList(AuxiliaresBll.PreencheComboAno(), ano);

            var model = viewModel.Listar(User.Identity.Name, mes, ano, false);

            return View(model);
        }

        [HttpGet]
        public ActionResult Filtrar(int mes, int ano, bool tipoData)
        {
            var model = viewModel.Listar(User.Identity.Name, mes, ano, tipoData);
            var lista = ConstroiTabela(model, mes);
            return Json(new { tbody = lista[0], tfoot = lista[1] }, JsonRequestBehavior.AllowGet);
        }
        #endregion

        #region Cadastro
        public ActionResult Cadastro(int id = 0) // Formulário de Cadastro
        {
            // Se o usuário ainda não tiver um cadastro gravado, retorna pro cadastro
            if (PessoaBll.GetPessoa(User.Identity.Name) == null)
                return RedirectToAction("Cadastro", "Perfil");

            var model = new Tarefa();
            if (id > 0)
            {
                model = TarefaBll.GetTarefa(id, User.Identity.Name);
            }

            return View(model);
        }
        #endregion

        #region Salvar
        [HttpPost]
        public ActionResult Cadastro(Tarefa modelView) // Método de gravação do registro
        {
            if (ModelState.IsValid)
            {
                var usuario = User.Identity.Name;
                try
                {
                    if (modelView.Id > 0)
                    {
                        var model = TarefaBll.GetTarefa(modelView.Id, usuario);
                        TryUpdateModel(model);
                        TarefaBll.Edit(model);
                    }
                    else
                    {
                        var model = new Tarefa();
                        TryUpdateModel(model);
                        TarefaBll.Add(model);
                    }

                    return RedirectToAction("Index");
                }
                catch (Exception ex)
                {
                    ModelState.AddModelError(string.Empty, ex);
                    return View(modelView);
                }
            }
            else
            {
                return View(modelView);
            }
        }
        #endregion

        //#region Excluir
        //[HttpPost]
        //public ActionResult Excluir (int id) // Método de exclusão do registro
        //{
        //    try
        //    {
        //       Tarefa.Delete(id);
        //        return Json(true);
        //    }
        //    catch (Exception ex)
        //    {
        //         string msgEx = "Houve um erro na exclusão do registro:";
        //        if (ex.InnerException == null)
        //        {
        //            msgEx += ex.Message;
        //        }
        //        else
        //        {
        //            msgEx += ex.InnerException.Message;
        //        }
        //        return Json(new { msgErro = msgEx });
        //    }
        //}
        //#endregion

        public List<string> ConstroiTabela(List<TarefaViewModel> model, int mes)
        {
            var tbody = new StringBuilder();
            var tfoot = new StringBuilder();

            if (model.Count() > 0)
            {
                foreach (TarefaViewModel m in model)
                {
                    var concluida = m.Concluida ? "tarefa-concluida" : "tarefa-aberta";
                    tbody.AppendFormat("<tr class=\"{0}\">", concluida);
                    tbody.AppendFormat("<td class=\"cod\">{0}</td>", m.Codigo);
                    tbody.AppendFormat("<td class=\"nome\">{0}</td>", m.Nome);
                    tbody.AppendFormat("<td class=\"datas\">{0}</td>", m.DataCadastro.ToShortDateString());
                    tbody.AppendFormat("<td class=\"datas\">{0}</td>", m.DataTarefa.ToShortDateString());
                    tbody.AppendFormat("<td class=\"hora-inicio\">{0}</td>", new DateTime(m.HoraInicio.Ticks).ToString("HH:mm"));
                    tbody.AppendFormat("<td class=\"hora-fim\">{0}</td>", new DateTime(m.HoraFim.Ticks).ToString("HH:mm"));
                    tbody.AppendFormat("<td class=\"concluido\"> <input type=\"checkbox\" id=\"Fechado\" disabled=\"disabled\"{0} /> </td>", m.Concluida ? " checked=\"checked\"" : "");
					tbody.AppendFormat("<td class=\"opcoes\"><a href=\"{0}/{1}\" class=\"editar\" >Editar</a> | ", Url.Action("Cadastro", "Tarefa"), m.Codigo);
                    tbody.AppendFormat("<a href=\"#\" data-url=\"{0}\" class=\"excluir\"> Excluir</a> </td>", Url.Action("Excluir", "Conta") + "/" + m.Codigo);
                    tbody.Append("</tr>");
                }

                tfoot.Append("<tr>");
                tfoot.AppendFormat("<td colspan=\"2\" style=\"text-align: right\"> Total de Tarefas para o mês {0}: </td>", mes);
                tfoot.AppendFormat("<td style=\"text-align: center; color: Red; font-size: 16px\">{0}</td>", model.Count());
                tfoot.AppendFormat("<td colspan=\"4\" style=\"text-align: right\">Total de Tarefas Concluídas no mês {0}: </td>", mes);
                tfoot.AppendFormat("<td style=\"text-align: center; color: Green; font-size: 16px\">{0}</td>", model.Where(w => w.Concluida).Count());
                tfoot.Append("</tr>");
            }
            else
            {
                tbody.Append("<tr><td colspan=\"8\">&nbsp;Não foram encontrados registros ou ainda não existem tarefas cadastradas.</td></tr>");
                tfoot.Append("<tr><td colspan=\"8\"></td></tr>");
            }

            var lista = new List<string>();
            lista.Add(tbody.ToString());
            lista.Add(tfoot.ToString());

            return lista;
        }
    }
}
